package com.cmc.cloud.cmclink.doc.api.document;

import com.cmc.cloud.cmclink.doc.api.document.rep.*;
import com.cmc.cloud.cmclink.doc.api.document.req.ImExActualLoadingReqDto;
import com.cmc.cloud.cmclink.doc.api.document.req.si.*;
import com.cmc.cloud.cmclink.doc.constant.DocApiConstants;
import com.cmes.framework.common.pojo.CommonResult;
import com.cmes.framework.common.pojo.PageResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * @author lzp
 */

@FeignClient(name = DocApiConstants.NAME)
@Tag(name = "RPC - 服务 SI信息处理")
public interface SiInfoApi {

    String PREFIX = DocApiConstants.PREFIX + "/si";

    /**
     * 提单查询（参数：网厅用户id、提单号、订舱号、船名航次、接货地、装货港、卸货港、目的地、
     * 截止单证补料日期、创建日期、货类、需要分页，
     *
     * @param blnoPageReqDto
     * @return
     */
    @PostMapping(PREFIX + "/query")
    @Operation(summary = "提单信息分页查询")
    CommonResult<PageResult<BlnoPageRespDto>> queryBlnoInfoPage(@RequestBody BlnoPageReqDto blnoPageReqDto);


    /**
     * 提单查询（参数：网厅用户id、提单号、订舱号、船名航次、接货地、装货港、卸货港、目的地、
     * 截止单证补料日期、创建日期、货类、需要分页，
     * 不分页统计查询出来提单的预配箱信息，
     * 例如：teu:67,containerInfo:20GP*3;40GP*6）
     *
     * @param blnoPageReqDto
     * @return
     */
    @PostMapping(PREFIX + "/containers")
    @Operation(summary = "提单箱型信息汇总", description = "《《分页参数无效》》 返回值：teu:67,containerInfo:20GP*3;40GP*6")
    CommonResult<BlnoContainersStatisticsRespDto> queryBlnoContainersInfo(@RequestBody BlnoPageReqDto blnoPageReqDto);

    /**
     * 提单根据状态数量统计（参数：网厅的用户id,返回各个状态及各个状态下的提单数量合计,
     * 例如：全部100，待审核：10，已确认10，待确认Draft10....已签发12）
     *
     * @param csmCode
     * @param creator
     * @return
     */
    @GetMapping(PREFIX + "/statistics")
    @Operation(summary = "提单状态统计")
    @Parameter(name = "csmCode", description = "企业csmCode")
    CommonResult<BlnoStatisticsRespDto> getBlnoStatistics(@RequestParam(value = "csmCode", required = true) String csmCode,
                                                          @RequestParam(value = "creator", required = false) String creator);

    /**
     * 提单详情（参数：网厅用户id、提单id、提单号、订舱号）
     *
     * @param blnoDetailReqDto
     * @return
     */
    @PostMapping(PREFIX + "/detail")
    @Operation(summary = "提单详情查询")
    CommonResult<BlnoInfoDto> getBlnoDetail(@RequestBody BlnoDetailReqDto blnoDetailReqDto);

    /**
     * 创建提单信息
     *
     * @param blnoInfoDto
     * @return
     */
    @PostMapping(PREFIX + "/create")
    @Operation(summary = "提单信息创建")
    CommonResult<Long> createSiInfo(@Valid @RequestBody BlnoInfoDto blnoInfoDto);


    /**
     * edi 批量创建提单信息(默认提交的是 confirm 的提单数据)
     *
     * @param blnoEdiConfirmDtos
     * @return Long
     */
    @PostMapping(PREFIX + "/ediBatchCreate")
    @Operation(summary = "EDI批量导入提单数据")
    CommonResult<Long> createSiInfo(@Valid @RequestBody List<BlnoEdiConfirmDto> blnoEdiConfirmDtos);

    /**
     * 网厅-Draft 确认
     *
     * @param draftConfirmDto
     * @return
     */
    @PostMapping(PREFIX + "/draftConfirm")
    @Operation(summary = "网厅-SI Draft 确认")
    CommonResult<Boolean> draftConfirm(@RequestBody DraftConfirmDto draftConfirmDto);

    /**
     * 提单预览
     *
     * @param draftConfirmDto
     * @return
     */
    @PostMapping(PREFIX + "/billOfLadingPreview")
    @Operation(summary = "网厅-提单预览")
    CommonResult<BlnoMaintenanceInfoRespDto> billOfLadingPreview(@RequestBody DraftConfirmDto draftConfirmDto);

    /**
     * 打印编辑
     *
     * @param printEditDto
     * @return
     */
    @PostMapping(PREFIX + "/printEdit")
    @Operation(summary = "网厅-打印编辑")
    CommonResult<byte[]> printEdit(@RequestBody PrintEditDto printEditDto);

    /**
     * 提单件详情
     *
     * @param draftConfirmDto
     * @return
     */
    @PostMapping(PREFIX + "/printDetails")
    @Operation(summary = "网厅-提单件详情")
    CommonResult<BillsHistoricalRecordsDto> printDetails(@RequestBody DraftConfirmDto draftConfirmDto);

    /**
     * 删除提单主数据(草稿状态下)
     *
     * @param blnoId blnoId
     * @return
     */
    @GetMapping(PREFIX + "/deleteBlno/{blnoId}")
    @Operation(summary = "删除提单主数据(草稿状态下)")
    CommonResult<Void> deleteBlno(@PathVariable("blnoId") Long blnoId);

    /**
     * 提单退回草稿状态
     *
     * @param blnoId blnoId
     * @return
     */
    @GetMapping(PREFIX + "/robackDraft/{blnoId}")
    @Operation(summary = "提单退回草稿状态")
    CommonResult<Void> robackDraft(@PathVariable("blnoId") Long blnoId);


    /**
     * 单证实装信息清单查询
     * 查询【SI03-确认SI】状态之后的提单数据，若没有，则查询SO预配舱单数据
     * @param imExActualLoadingReqDto 实装信息查询请求dto
     * @return 单证实装信息列表
     */
    @PostMapping(PREFIX + "/impExActualLoadingList")
    @Operation(summary = "单证实装信息清单查询")
    CommonResult<List<ImExActualLoadingRespDto>> qryImpExActualLoadingList(@RequestBody ImExActualLoadingReqDto imExActualLoadingReqDto);

    /**
     * 提单拆并审核详情
     * @param type 拆并单类型
     * @param blnoId 提单主键ID
     * @return
     */
    @GetMapping( PREFIX + "/getSplitCombineAuditDetail/{type}/{blnoId}")
    @Operation(summary = "提单拆分，更正审核详情")
    CommonResult<BlnoSplitCombineRespDto> getSplitCombineAuditDetail(@PathVariable("type") String type,@PathVariable("blnoId") Long blnoId);


    /**
     * taskID 12247 箱管RPC接口提供
     * （字段名称按照单证的命名风格定义）
     * 单证装卸船数据查询接口
     * 入参(单个):  vsl ,voy(分exvoy , imvoy) , 港口 (分POL , POD)  经营人SPACEOWNER(可选) , blno(可选)
     *
     * @param blnoVesselVesselPortReqDto
     * @return
     */
    @PostMapping(PREFIX + "/queryBlnoInfoByVesselVesselPort")
    @Operation(summary = "单证装卸船数据查询接口")
    CommonResult<List<BlnoVesselVesselPortRespDto>> queryBlnoInfoByVesselVesselPort(@RequestBody @Valid BlnoVesselVesselPortReqDto blnoVesselVesselPortReqDto);

}
